tg-me.com/BookPython/3650
Last Update:
В Python оператор квадратных скобок []
можно переопределить, реализовав магический метод __getitem__
. Это позволяет, например, создать объект, который виртуально содержит бесконечное количество повторяющихся элементов:
class Cycle:
def __init__(self, lst):
self._lst = lst
def __getitem__(self, index):
return self._lst[index % len(self._lst)]
print(Cycle(['a', 'b', 'c'])[100]) # 'b'
Необычность оператора
[]
в Python в том, что он поддерживает особый синтаксис. Его можно использовать не только так: [2]
, но и так: [2:10]
, [2:10:2]
, [2::2]
или даже [:]
. Смысл такой записи — [start:stop:step]
, но в ваших собственных объектах вы можете использовать этот синтаксис как угодно.Что же передаётся в
__getitem__
в таких случаях? Объекты slice
созданы специально для этого.Пример:
class Inspector:
def __getitem__(self, index):
print(index)
Inspector()[1]
# 1
Inspector()[1:2]
# slice(1, 2, None)
Inspector()[1:2:3]
# slice(1, 2, 3)
Inspector()[:]
# slice(None, None, None)
Inspector()[:, 0, :]
# (slice(None, None, None), 0, slice(None, None, None))
Объект
slice
сам по себе ничего не делает — он просто хранит атрибуты start
, stop
и step
:
s = slice(1, 2, 3)
print(s.start) # 1
print(s.stop) # 2
print(s.step) # 3
👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3650